package com.waypolice.common.utils;

import com.waypolice.common.utils.ReflectionUtils;
import com.waypolice.common.utils.Ttools;
//import com.waypolice.pojo.ConstructionBankData;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;

import java.io.File;
import java.io.StringReader;
import java.util.Iterator;
import java.util.List;

/**
 * XML解析工具
 * @author 312小时
 * Created by 312小时 on 2018/8/23.
 */
public class Dom4JUtil{

    /**
     * 将文件转为对象
     * @param clazz 类的class对象
     * @param tools 泛型工具，获取类的List集合
     * @param xml  要转换的文件
     * @return 对象集合
     */
    public List<Object> getToObject(Class<?> clazz, Ttools tools, String xml){
        List list = tools.getList();
        // 解析xml文件创建SAXReader的对象reader
        SAXReader reader = new SAXReader();
        StringReader strreader=new StringReader(xml);
        try {
            // 通过reader对象的read方法加载xml文件,获取docuemnt对象。
            Document document = reader.read(strreader);
            // 通过document对象获取根节点
            Element rootElement = document.getRootElement();
            // 通过element对象的elementIterator方法获取迭代器
            Iterator it = rootElement.elementIterator();
            // 遍历迭代器，获取根节点
            while (it.hasNext()) {
                System.out.println("=====开始遍历根节点=====");
                Object o=new Object();
                Object x= null;
                try {
                    x = ReflectionUtils.getNewInstance(clazz);
                } catch (InstantiationException e) {
                    e.printStackTrace();
                } catch (IllegalAccessException e) {
                    e.printStackTrace();
                }
                Element root_element = (Element) it.next();
                //子节点迭代器
                Iterator itt = root_element.elementIterator();
                //Iterator<Element> elementIterator = root_element.elementIterator();
                while (itt.hasNext()) {

                    System.out.println("=====开始遍历子节点=====");
                    Element childElement = (Element) itt.next();
                    //获取所有属性
                    //List<StringBuilder> fields = ReflectionUtils.getFields(clazz);
                    //获取所有自身的方法
                    //List<StringBuilder> methods = ReflectionUtils.getMethods(clazz);
                    try {
                        o = ReflectionUtils.setField(clazz, childElement.getName().toLowerCase(),x, childElement.getStringValue());
                    } catch (NoSuchFieldException e) {
                        e.printStackTrace();
                    } catch (IllegalAccessException e) {
                        e.printStackTrace();
                    }
                    System.out.println("=====子结点遍历结束=====");
                    //System.out.println("子节点名：" + childElement.getName() + "--子节点值：" + childElement.getStringValue());
                }
                list.add(o);
                System.out.println("=====根结点遍历结束=====");
            }
        } catch (DocumentException e) {
            e.printStackTrace();
        }
        return list;

    }

    /**
     * 将文件转为对象
     * @param clazz 类的class对象
     * @param tools 泛型工具，获取类的List集合
     * @param path 文件路径
     * @return  对象集合
     */
    public List<Object> getObject(Class<?> clazz, Ttools tools, String path){
        List list = tools.getList();
        // 解析xml文件创建SAXReader的对象reader
        SAXReader reader = new SAXReader();
        try {
            // 通过reader对象的read方法加载xml文件,获取docuemnt对象。
            Document document = reader.read(new File(path));
            // 通过document对象获取根节点
            Element rootElement = document.getRootElement();
            // 通过element对象的elementIterator方法获取迭代器
            Iterator it = rootElement.elementIterator();
            // 遍历迭代器，获取根节点
            while (it.hasNext()) {
                System.out.println("=====开始遍历根节点=====");
                Object o=new Object();
                Object x= null;
                try {
                    x = ReflectionUtils.getNewInstance(clazz);
                } catch (InstantiationException e) {
                    e.printStackTrace();
                } catch (IllegalAccessException e) {
                    e.printStackTrace();
                }
                Element root_element = (Element) it.next();
                //子节点迭代器
                Iterator itt = root_element.elementIterator();
                //Iterator<Element> elementIterator = root_element.elementIterator();
                while (itt.hasNext()) {

                    System.out.println("=====开始遍历子节点=====");
                    Element childElement = (Element) itt.next();
                    //获取所有属性
                    //List<StringBuilder> fields = ReflectionUtils.getFields(clazz);
                    //获取所有自身的方法
                    //List<StringBuilder> methods = ReflectionUtils.getMethods(clazz);
                    try {
                        o = ReflectionUtils.setField(clazz, childElement.getName().toLowerCase(),x, childElement.getStringValue());
                    } catch (NoSuchFieldException e) {
                        e.printStackTrace();
                    } catch (IllegalAccessException e) {
                        e.printStackTrace();
                    }
                    System.out.println("=====子结点遍历结束=====");
                    //System.out.println("子节点名：" + childElement.getName() + "--子节点值：" + childElement.getStringValue());
                }
                list.add(o);
                System.out.println("=====根结点遍历结束=====");
            }
        } catch (DocumentException e) {
            e.printStackTrace();
        }
        return list;

    }

//    public static void main(String[] args){
//        Ttools<ConstructionBankData> tools=new Ttools<ConstructionBankData>();
//        List<Object> object = new Dom4JUtil().getObject(ConstructionBankData.class,new Ttools<ConstructionBankData>(), "");
//        for(int i=0;i<object.size();i++){
//            if(object.get(i) instanceof ConstructionBankData){
//                System.out.println(object.get(i).toString());
//            }
//        }
//    }

}
